package com.kf.conf;

import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;

@Configuration
public class ShiroConf  {
	
	/**
	 * 创建ShiroFilterFactoryBean
	 */
	@Bean
	public ShiroFilterFactoryBean ShiroFilterFactoryBean(DefaultWebSecurityManager securityManager){
		ShiroFilterFactoryBean ShiroFilterFactoryBean = new ShiroFilterFactoryBean();
		System.out.println("================ShiroFilterFactoryBean====================");
		ShiroFilterFactoryBean.setSecurityManager(securityManager);
		//shiro内置过滤器，可实现权限相关的拦截器
		/**
		 * 常用的过滤器：
		 * 	anon：无需认证登录即可访问
		 * authc：必须认证才可以访问
		 * use：如果使用rememberMe的功能可以直接访问
		 * perms：该资源必须有资源权限才可以访问
		 * role：该资源必须得到角色权限才可以访问
		 */
		//顺序的map!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		//顺序的map!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		//顺序的map!!!!!!!!!!!!!!!!!!!!!!!!!!!!
		Map<String,String> map = new LinkedHashMap<>();
		
		//A: 认证即可访问。当和下面的  perms资源权限同时存在时，结果是 认证过没有资源权限也可以访问
/*		map.put("/add", "authc");
		map.put("/update", "authc");*/
		
		//不需要拦截的 这个是测试页面
		map.put("/testT", "anon");
		//不拦截登录页面
		map.put("/login", "anon");
		
		
		//B:资源权限过滤
		map.put("/add", "perms[user:add]");
		map.put("/update", "perms[user:update]");
		
		//放在最后
		map.put("/*", "authc");
		ShiroFilterFactoryBean.setFilterChainDefinitionMap(map);
		
		//修改登录页面
		ShiroFilterFactoryBean.setLoginUrl("/toLogin");
		//加入未授权页面
		ShiroFilterFactoryBean.setUnauthorizedUrl("noAuth");
		
		
		return ShiroFilterFactoryBean;
	}
	
	/**
	 * 创建DefaultWebSecurityManager
	 */
	@Bean
	public DefaultWebSecurityManager securityManager(UserRealm userRealm){
		System.out.println("=================securityManager===================");
		org.apache.shiro.web.mgt.DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
		securityManager.setRealm(userRealm);
		return securityManager;
	}
	
	/**
	 * 创建Realm
	 */
	@Bean
	public UserRealm userRealm(){
		System.out.println("================userRealm====================");
		return new UserRealm();
	}
	
	/**
	 *  配置shiroDialect  用于thymeleaf标签配合使用
	 *  ShiroDialect  需要手工导入!!
	 */
	@Bean
	public ShiroDialect ShiroDialect(){
		return new ShiroDialect();
	}

}
